<?php 
class Notaingreso extends AppModel{
    var $name = 'Notaingreso';
    
    var $belongsTo = array(
        'Documento'=>array('className'=>'Documento','foreignKey'=>'documento_id'),
        'Ordencompra'=>array('className'=>'Ordencompra','foreignKey'=>'ordencompra_id'),
        'Almacen'=>array('className'=>'Almacen','foreignKey'=>'almacen_id')
    );
    
    function countNotaingreso($params){return $this->find('count',$params);}
	function dataNotaingreso($params){return $this->find('all',$params);}
    
	function setActualizar($data, $variables = null){
        App::import('Model','Serie');  $this->Serie = new Serie();
        App::import('Model','Detallenotaingreso');  $this->Detallenotaingreso = new Detallenotaingreso();
        App::import('Model','Ordencompra');  $this->Ordencompra = new Ordencompra();
		App::import('Model','Detalleordencompra');  $this->Detalleordencompra = new Detalleordencompra();
		App::import('Model','AlmacenesArticulo');  $this->AlmacenesArticulo = new AlmacenesArticulo();
		App::import('Model','Articulo');  $this->Articulo = new Articulo();
		App::import('Model','Kardex');  $this->Kardex = new Kardex();
		App::import('Model','Documento');  $this->Documento = new Documento();
		
		/** guardamos la nota de ingreso -- pedimos la numeracion del nuevo documento **/
		$respuesta = $this->Serie->actualizarNumeracion('organizacion_id', $variables['Organizacion']['id'], null,$variables['Tipodocumento']['notaingreso_id']);
        if(!$respuesta['respuesta']) return $respuesta;

		/** Generamos la numeracion **/
		$documento = array('Documento'=>array(	'serie'=>$respuesta['serie'],
												'numero'=>$respuesta['numero'],
												'numero_serie'=>trim($respuesta['numero_serie']),
												'tipodocumento_id'=>$variables['Tipodocumento']['notaingreso_id'],
												'organizacion_id'=>$variables['Organizacion']['id'],
												'usuario_id'=>$variables['Usuario']['id']));	
	  	
		/** guardamos el documento que formamos **/
		$this->Documento->create();
		if(!$this->Documento->save($documento['Documento']))  return $this->visualizarError($this->Documento->validationErrors);
		
		/** guardamos la nota de ingreso **/
		$data['Notaingreso']['documento_id'] = $this->Documento->id;
		$data['Notaingreso']['numero']=$documento['Documento']['numero_serie'];
		
		$this->create();
		if(!$this->save($data['Notaingreso']))  return $this->visualizarError($this->validationErrors);
		
		$data['Notaingreso']['id'] = $this->id;
		
		/** guardamos los detalles de la nota de ingreso **/
		foreach($data['Detallenotaingreso'] as $detallenotaingreso){ 
			if(!empty($detallenotaingreso['cantidad'])){
			    //guardamos el detalle nota ingreso
    		    $detallenotaingreso['notaingreso_id'] = $data['Notaingreso']['id'];
    		    $this->Detallenotaingreso->create();
    		    if(!$this->Detallenotaingreso->save($detallenotaingreso))  return $this->visualizarError($this->Detallenotaingreso->validationErrors);
    			
    			//actualizamos la cantidad nota ingreso del detalle orden compra
    			$conditions = array('ordencompra_id'=>$data['Notaingreso']['ordencompra_id'],'articulo_id'=>$detallenotaingreso['articulo_id']);
    			$detalleordencompra = $this->Detalleordencompra->find('first',array('conditions'=>$conditions,'fields'=>array('id','cantidad_nt_ing'),'recursive'=>-1));
    			if(empty($detalleordencompra))  return array('respuesta'=>false, 'mensaje'=>'NO SE ENCONTRO EL DETALLE ORDEN COMPRA');
    			
    			$detalleordencompra['Detalleordencompra']['cantidad_nt_ing'] += $detallenotaingreso['cantidad'];
    			if(!$this->Detalleordencompra->save($detalleordencompra['Detalleordencompra']))  return $this->visualizarError($this->Detalleordencompra->validationErrors);
    			
    			//actualizamos el stock del almacen
    			if(!$this->AlmacenesArticulo->setActualizarStock($data['Notaingreso']['almacen_id'],$detallenotaingreso['articulo_id'],$detallenotaingreso['cantidad'],'SUMA','DF'))
    			    return array('respuesta'=>false, 'mensaje'=>'STOCK NO ACTUALIZADO');
    			    
    			//actualizamos el stock del articulo
    			if(!$this->Articulo->setActualizarStock($detallenotaingreso['articulo_id'],$detallenotaingreso['cantidad'],'SUMA','DF'))
    			    return array('respuesta'=>false, 'mensaje'=>'STOCK NO ACTUALIZADO');
    			    
    			//generamos el kardex
    			$almacen_articulo = $this->AlmacenesArticulo->find('first',array('conditions'=>array('almacen_id'=>$data['Notaingreso']['almacen_id'],'articulo_id'=>$detallenotaingreso['articulo_id']),'recursive'=>-1));
    			$articulo = $this->Articulo->find('first',array('conditions'=>array('id'=>$detallenotaingreso['articulo_id']),'recursive'=>-1));
    			
    			$kardex['Kardex'] = array('documento_id'=>$data['Notaingreso']['documento_id'],
    			                            'almacenes_articulos_id'=>$almacen_articulo['AlmacenesArticulo']['id'],
    			                            'ingreso'=>$detallenotaingreso['cantidad'],
    			                            'almacen_stock'=>$almacen_articulo['AlmacenesArticulo']['stock_fisico'],
    			                            'articulo_stock'=>$articulo['Articulo']['stockfisico']);
    			$this->Kardex->create();
    			if(!$this->Kardex->save($kardex['Kardex']))  return array('respuesta'=>false, 'mensaje'=>'KARDEX NO ACTUALIZADO',$kardex,$articulo,$almacen_articulo); 
    			
    			unset($kardex);   
			}
		}
		
		//actualizamos el estado de la orden de compra
		$conditions = array('id'=>$data['Notaingreso']['ordencompra_id']);
		$ordencompra = $this->Ordencompra->find('first',array('conditions'=>$conditions,'fields'=>array('id','ordencompraestado_id'),'recursive'=>-1));
		if(empty($ordencompra))  return array('respuesta'=>false, 'mensaje'=>'NO SE ENCONTRO LA ORDEN COMPRA');    
		
		if(!(($ordencompra['Ordencompra']['ordencompraestado_id']==1) || ($ordencompra['Ordencompra']['ordencompraestado_id']==4))){
		    return array('respuesta'=>false, 'mensaje'=>'LA ORDEN COMPRA YA FUE INGRESADA');
		}else{
		    //verificamos cuantos detalles faltan entregar
		    $conditions = array('ordencompra_id'=>$data['Notaingreso']['ordencompra_id'], '"Detalleordencompra"."cantidad" > "Detalleordencompra"."cantidad_nt_ing"');
			$detalleordencompra = $this->Detalleordencompra->find('count',array('conditions'=>$conditions,'recursive'=>-1));
			if(!empty($detalleordencompra)) $ordencompra['Ordencompra']['ordencompraestado_id'] = 4;
			else $ordencompra['Ordencompra']['ordencompraestado_id'] = 5;
			if(!$this->Ordencompra->save($ordencompra['Ordencompra']))  return $this->visualizarError($this->Ordencompra->validationErrors); 
		}
		     
		return array('respuesta'=>true, 'mensaje'=>"LA NOTA INGRESO HA SIDO GUARDADA",'numero'=>$data['Notaingreso']['numero']);    
    }
    
    /**Nos devuelve los datos de la nota de ingreso
     * Ingresa el id
     */
    function getNotaingreso($nota_id = null){
        if(empty($nota_id)) $nota_id = 0;
        $notaingreso = $this->findById($nota_id);
        if(empty($notaingreso)) return $notaingreso;
        
        app::import('Model','Proveedor');            $this->Proveedor = new Proveedor();
        $proveedor = $this->Proveedor->findById($notaingreso['Ordencompra']['proveedor_id']);
        
        $notaingreso['Ordencompra']['proveedor'] = $proveedor['Proveedor']['razonsocial'];
        return $notaingreso;
    }
}